home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / games / readjoystick / advanced_readjoy.s
Text File  |  1980-01-03  |  6KB  |  245 lines

  1.  
  2. ;/* Extended Joystick Reader
  3.   * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  4.   * The example provides you with a working test of the routine, this type of
  5.   * routine is needed for games because they often need more information than
  6.   * just Left/Right/Up/Down/Fire, they need up/left, down/left, etc.etc. and
  7.   * if a fire button has been pressed ONCE, not the state of the fire button
  8.   * i.e. trigger actions,etc. The provided routine works with both joysticks
  9.   * and should need no changes for virtually any time of game.
  10.   * 
  11.   * 2-Cool/Ex-Scene ... Sort of :)
  12.   *
  13.   */
  14.  
  15. _ciaa        =    $bfe001
  16. _custom        =    $dff000
  17. vhposr        =    $0006
  18. joy0dat        =    $000A
  19. joy1dat        =    $000C
  20. color00        =    $0180
  21.  
  22. testloop:    cmp.b    #255,_custom+vhposr    * wait vblank..
  23.         bne.s    testloop
  24.  
  25.         lea    joy1(pc),a0        * joystick switch memory..
  26.         moveq    #1,d1            * joystick port 1
  27.         bsr    _LVOExtReadJoy
  28.  
  29.         tst.w    joy_oneshotfdn(a0)    * fire button triggered once?
  30.         beq.w    no_hit
  31.  
  32.         move.w    #$f00,_custom+color00    * flash screen red
  33. no_hit:
  34.  
  35.         btst    #6,_ciaa        * loop condition: Exit on LMB
  36.         bne.s    testloop
  37.         rts
  38.  
  39. *******************************************************************************
  40. * _LVOExtReadJoy                All Trashed Registers Preserved
  41. * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  42. * Performs extensive state anaysis of the Amiga intenal joystick port hardware
  43. * to determine 16 different state flags. Code is completely pc-relative and 
  44. * fully relocatable.
  45. *
  46. * $Inputs:    a0.l = joystick switch buffer (buffer size is = joy_SIZEOF)
  47. *        d1.l = 0 for reading of Joystick connected to Port [0] 
  48. *               1 for reading of Joystick connected to Port [1]
  49. *
  50. * $Outputs:    None. (simply test switch settings returned in switch buffer)
  51. *******************************************************************************
  52.         rsreset
  53. joy_left1:    rs.b    1        * \  (used to test if already pressed)
  54. joy_right1:    rs.b    1        *  \   tempory storage of joystick
  55. joy_up1:    rs.b    1        *   \   switches for all L,R,U,D,F
  56. joy_down1:    rs.b    1        *    \
  57. joy_fire1:    rs.b    1        *     \
  58.  
  59. joy_left:    rs.b    1        * Joystick Left
  60. joy_right:    rs.b    1        * Joystick Right
  61. joy_up:        rs.b    1        * Joystick Up
  62. joy_down:    rs.b    1        * Joystick Down
  63. joy_fire:    rs.b    1        * Joystick Fire
  64.  
  65. joy_upright:    rs.b    1        * Joystick Up/Right
  66. joy_upleft:    rs.b    1        * Joystick Up/Left
  67. joy_downright:    rs.b    1        * Joystick Down/Right
  68. joy_downleft:    rs.b    1        * Joystick Down/Left
  69.  
  70. joy_oneshotlft    rs.b    1        * Joystick Left  (Oneshot:Auto-Toggled)
  71. joy_oneshotrht    rs.b    1        * Joystick Right (Oneshot:Auto-Toggled)
  72. joy_oneshotup    rs.b    1        * Joystick Up    (Oneshot:Auto-Toggled)
  73. joy_oneshotdwn    rs.b    1        * Joystick Down  (Oneshot:Auto-Toggled)
  74.  
  75. joy_oneshotfdn    rs.w    1        * Joystick Fire  (Oneshot:Set Pressed)
  76. joy_oneshotfup    rs.w    1        * Joystick Fire  (Oneshot:After Toggle)
  77. joy_direction:    rs.w    1        * Joystick Direction (values)
  78.  
  79. joy_SIZEOF    rs.b    0        * calculate buffer size requirements
  80.         rsreset
  81.  
  82. _LVOExtReadJoy:    movem.l    d0-d2,-(sp)        * stack trashed registers
  83.  
  84.         move.w    _custom+joy0dat,d0    * joystick 0
  85.         moveq    #6,d2            * joystick 0 fire button bit
  86.         tst.b    d1            * read which joystick?
  87.         beq.s    readjoy0
  88.         move.w    _custom+joy1dat,d0    * joystick 1 switches
  89.         moveq    #7,d2            * joystick 1 fire button bit
  90.  
  91. readjoy0:    btst    #1,d0            * joystick left pressed?
  92.         sne    joy_right(a0)
  93.         btst    #9,d0            * joystick right pressed?
  94.         sne    joy_left(a0)
  95.  
  96.         move.w    d0,d1
  97.         lsr.w    #1,d1
  98.         eor.w    d1,d0
  99.         btst    #0,d0            * joystick down pressed?
  100.         sne    joy_down(a0)
  101.         btst    #8,d0            * joystick up pressed?
  102.         sne    joy_up(a0)
  103.  
  104.         btst    d2,_ciaa
  105.         seq    joy_fire(a0)        * joystick fire button pressed?
  106.  
  107.         move.b    joy_up(a0),d0
  108.         and.b    joy_right(a0),d0
  109.         move.b    d0,joy_upright(a0)    * joystick up/right pressed?
  110.  
  111.         move.b    joy_down(a0),d0
  112.         and.b    joy_right(a0),d0
  113.         move.b    d0,joy_downright(a0)    * joystick down/right pressed?
  114.  
  115.         move.b    joy_down(a0),d0
  116.         and.b    joy_left(a0),d0
  117.         move.b    d0,joy_downleft(a0)    * joystick down/left pressed?
  118.  
  119.         move.b    joy_up(a0),d0
  120.         and.b    joy_left(a0),d0
  121.         move.b    d0,joy_upleft(a0)    * joystick up/left pressed?
  122.  
  123.         tst.b    joy_fire1(a0)        * tempfire clear?
  124.         beq.b    joyset1_2
  125.  
  126.         clr.b    joy_oneshotfdn(a0)
  127.         tst.b    joy_fire(a0)
  128.         beq.b    joyset1_1
  129.  
  130.         tst.w    joy_oneshotfup(a0)
  131.         beq.b    joyset1_3
  132.  
  133.         subq.w    #1,joy_oneshotfup(a0)
  134.         bra.b    joyset1_3
  135.  
  136. joyset1_1:    clr.b    joy_fire1(a0)
  137.         neg.w    joy_oneshotfup(a0)
  138.         bra.b    joyset1_3
  139.  
  140. joyset1_2:    tst.b    joy_fire(a0)        * if fire clear
  141.         sne    joy_oneshotfdn(a0)    * Do OneShot Fire down
  142.         sne    joy_fire1(a0)        * if tempfire clear
  143.         beq.b    joyset1_3        * skip oneshot set...
  144.  
  145.         move.w    #-1,joy_oneshotfup(a0)    * first time fire pressed
  146.  
  147. joyset1_3:    tst.b    joy_left1(a0)
  148.         beq.b    joyset1_4
  149.  
  150.         clr.b    joy_oneshotlft(a0)
  151.         tst.b    joy_left(a0)
  152.         bne.b    joyset1_5
  153.  
  154.         clr.b    joy_left1(a0)
  155.  
  156. joyset1_4:    tst.b    joy_left(a0)
  157.         sne    joy_oneshotlft(a0)
  158.         sne    joy_left1(a0)
  159.  
  160. joyset1_5:    tst.b    joy_right1(a0)
  161.         beq.b    joyset1_6
  162.  
  163.         clr.b    joy_oneshotrht(a0)
  164.         tst.b    joy_right(a0)
  165.         bne.b    joyset1_7
  166.  
  167.         clr.b    joy_right1(a0)
  168.  
  169. joyset1_6:    tst.b    joy_right(a0)
  170.         sne    joy_oneshotrht(a0)
  171.         sne    joy_right1(a0)
  172.  
  173. joyset1_7:    tst.b    joy_up1(a0)
  174.         beq.b    joyset1_8
  175.  
  176.         clr.b    joy_oneshotup(a0)
  177.         tst.b    joy_up(a0)
  178.         bne.b    joyset1_9
  179.  
  180.         clr.b    joy_up1(a0)
  181.  
  182. joyset1_8:    tst.b    joy_up(a0)
  183.         sne    joy_oneshotup(a0)
  184.         sne    joy_up1(a0)
  185.  
  186. joyset1_9:    tst.b    joy_down1(a0)
  187.         beq.b    joyset1_10
  188.  
  189.         clr.b    joy_oneshotdwn(a0)
  190.         tst.b    joy_down(a0)
  191.         bne.b    joyset1_11
  192.  
  193.         clr.b    joy_down1(a0)
  194.  
  195. joyset1_10:    tst.b    joy_down(a0)
  196.         sne    joy_oneshotdwn(a0)
  197.         sne    joy_down1(a0)
  198.  
  199. joyset1_11:    moveq    #1,d0
  200.         tst.b    joy_upright(a0)
  201.         bne.b    joy_done
  202.  
  203.         moveq    #3,d0
  204.         tst.b    joy_downright(a0)
  205.         bne.b    joy_done
  206.  
  207.         moveq    #5,d0
  208.         tst.b    joy_downleft(a0)
  209.         bne.b    joy_done
  210.  
  211.         moveq    #7,d0
  212.         tst.b    joy_upleft(a0)
  213.         bne.b    joy_done
  214.  
  215.         moveq    #0,d0
  216.         tst.b    joy_up(a0)
  217.         bne.b    joy_done
  218.  
  219.         moveq    #2,d0
  220.         tst.b    joy_right(a0)
  221.         bne.b    joy_done
  222.  
  223.         moveq    #4,d0
  224.         tst.b    joy_down(a0)
  225.         bne.b    joy_done
  226.  
  227.         moveq    #6,d0
  228.         tst.b    joy_left(a0)
  229.         bne.b    joy_done
  230.  
  231.         moveq    #-1,d0
  232. joy_done:    move.w    d0,joy_direction(a0)
  233.  
  234.         movem.l    (sp)+,d0-d2        * restore stacked registers
  235.         rts
  236.  
  237. *-------------- joystick buttons/flags..
  238.  
  239. joy1:        ds.b    joy_SIZEOF        * Buffer for joystick switches
  240. joy2:        ds.b    joy_SIZEOF        *
  241.  
  242.  
  243.         end
  244.  
  245.